package sword.offer;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;

/**
 * 输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。为简单起见，标点符号和普通字母一样处理。<br/>
 * 例如输入字符串"I am a student. "，则输出"student. a am I"。<br/>
 * 链接：https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof<br/>
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class FiftyEight {
    public static void main(String[] args) {
        Solution solution = new Solution();
        String s = solution.reverseWords("a good  example");
        System.out.println(s);
    }

    /**
     * 利用栈
     * 首先得识别单词  根据题意，当遇到空格时，即为单词（包括标点符号）。
     * 将识别的单词放入到栈中
     * 最后出栈组合成新的字符串 需要注意带有空格
     * */
    static class Solution {
        public String reverseWords(String s) {
            int i = 0;
            Deque<String> stack = new ArrayDeque<>();
            StringBuilder stringBuilder = new StringBuilder();
            while(i < s.length()){
                StringBuilder sb = new StringBuilder();
                while(i < s.length() && s.charAt(i) != ' '){
                    sb.append(s.charAt(i));
                    i++;
                }
                // 这里一定要加判断
                if(sb.length() != 0){
                    stack.add(sb.toString());
                }
                i++;
            }
            while(!stack.isEmpty()){
                stringBuilder.append(stack.removeLast());
                stringBuilder.append(" ");
            }
            return stringBuilder.toString().trim();
        }
    }
}
